From: Keir Fraser Date: Fri, 24 Aug 2007 15:19:14 +0000 (+0100) Subject: x86: Fix paging_init() to not overwrite existing page-directory entry X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14987^2~66 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22Dat/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22Dat?a=commitdiff_plain;h=83562577423fcbfb0ed3510a423d2bdf0bcc84ec;p=xen.git x86: Fix paging_init() to not overwrite existing page-directory entry for fixmap area. Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/x86_32/mm.c b/xen/arch/x86/x86_32/mm.c index eab7e1be72..9b3780f0c9 100644 --- a/xen/arch/x86/x86_32/mm.c +++ b/xen/arch/x86/x86_32/mm.c @@ -68,7 +68,6 @@ l2_pgentry_t *virt_to_xen_l2e(unsigned long v) void __init paging_init(void) { - void *ioremap_pt; unsigned long v; struct page_info *pg; int i; @@ -115,13 +114,17 @@ void __init paging_init(void) for ( i = 0; i < (mpt_size / BYTES_PER_LONG); i++) set_gpfn_from_mfn(i, 0x55555555); - /* Create page tables for ioremap(). */ + /* Create page tables for ioremap()/map_domain_page_global(). */ for ( i = 0; i < (IOREMAP_MBYTES >> (L2_PAGETABLE_SHIFT - 20)); i++ ) { - ioremap_pt = alloc_xenheap_page(); - clear_page(ioremap_pt); - l2e_write(&idle_pg_table_l2[l2_linear_offset(IOREMAP_VIRT_START) + i], - l2e_from_page(virt_to_page(ioremap_pt), __PAGE_HYPERVISOR)); + void *p; + l2_pgentry_t *pl2e; + pl2e = &idle_pg_table_l2[l2_linear_offset(IOREMAP_VIRT_START) + i]; + if ( l2e_get_flags(*pl2e) & _PAGE_PRESENT ) + continue; + p = alloc_xenheap_page(); + clear_page(p); + l2e_write(pl2e, l2e_from_page(virt_to_page(p), __PAGE_HYPERVISOR)); } } diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index 600d1a7034..596bf5cecd 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -100,15 +100,15 @@ void __init paging_init(void) unsigned long i, mpt_size, va; l3_pgentry_t *l3_ro_mpt; l2_pgentry_t *l2_ro_mpt = NULL; - struct page_info *l1_pg, *l2_pg; + struct page_info *l1_pg, *l2_pg, *l3_pg; /* Create user-accessible L2 directory to map the MPT for guests. */ - if ( (l2_pg = alloc_domheap_page(NULL)) == NULL ) + if ( (l3_pg = alloc_domheap_page(NULL)) == NULL ) goto nomem; - l3_ro_mpt = page_to_virt(l2_pg); + l3_ro_mpt = page_to_virt(l3_pg); clear_page(l3_ro_mpt); l4e_write(&idle_pg_table[l4_table_offset(RO_MPT_VIRT_START)], - l4e_from_page(l2_pg, __PAGE_HYPERVISOR | _PAGE_USER)); + l4e_from_page(l3_pg, __PAGE_HYPERVISOR | _PAGE_USER)); /* * Allocate and map the machine-to-phys table.